# -*- coding:utf8 -*-
from forms import DisciplinaRelacionadaForm, CompetenciaForm, HabilidadeForm, ConteudoProgramaticoForm
from models import PlanoEnsino, CompetenciaHabilidade, DisciplinaRelacionada, Professor

from django.contrib.auth.decorators import login_required
from django.contrib.auth.views import login
from django.template import RequestContext
from django.template.loader import render_to_string
from django.template.defaultfilters import register
from django.forms.models import modelformset_factory
from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import render_to_response
from bloom import BLOOM_CHOICES

erroDisciplinaRelacionada=''
erroCompetencia=''
erroHabilidade=''
erroConteudoProgramatico=''
erroPlanoEnsino=''

@login_required()
def VerificarPermissao(request, id):
    usuario_id = request.user.id
    pe = PlanoEnsino.objects.get(id=id)
    professor_id = pe.professor.id
    return (professor_id == usuario_id)


@csrf_exempt
@login_required()
def irPrincipal(request):
    return HttpResponseRedirect('/PlanoEnsino/')
    #return render_to_response('template.html', locals() , context_instance=RequestContext(request))

@login_required()
@csrf_exempt
def PlanoEnsinoView(request):
    global erroDisciplinaRelacionada
    erro = ''
    erroLista = ''
    usuario = request.user   
    
    if erroDisciplinaRelacionada:
        erro = erroPlanoEnsino
    try:
        usuario_id = request.user.id
        planosensinos = ListaPlanoEnsino(request, usuario_id)
        if not len(planosensinos):
            erroLista = "Nenhum registro encontrado"
    except Exception as ex:
            erroLista = str(ex)
    return render_to_response('planoensino.html', locals() , context_instance=RequestContext(request))


def ListaPlanoEnsino(request, usuario):
    
    try:    
        
        planoEnsino_lista = PlanoEnsino.objects.filter(professor=usuario)
        
        
        planoEnsino = {}
        listaPlanoEnsino = []

        for item in planoEnsino_lista:
            planoEnsino['pe'] = item
            planoEnsino['id'] = item.id
            planoEnsino['anoLetivo'] = item.anoLetivo
            planoEnsino['semestre'] = item.semestre
            planoEnsino['turma'] = item.turma
            planoEnsino['cargaHoraria'] = item.cargaHoraria
            planoEnsino['professor'] = item.professor
            planoEnsino['curso_disciplina'] = item.curso_disciplina
            planoEnsino['conteudoprogramatico'] = item.conteudoprogramatico
            planoEnsino['disciplinarelacionada'] = item.disciplinarelacionada
            planoEnsino['competencia'] = item.competencia
            planoEnsino['habilidade'] = item.habilidade
            listaPlanoEnsino.append(planoEnsino)
            planoEnsino = {}
        return listaPlanoEnsino
    except Exception as ex:
        raise ex


#### Disciplina Relacionada ####

@login_required()
@csrf_exempt
def DisciplinaRelacionadaView(request, id):
    global erroDisciplinaRelacionada
    erro = ''
    erroLista = ''
    if VerificarPermissao(request, id):
        form = DisciplinaRelacionadaForm()
        usuario = request.user
        if erroDisciplinaRelacionada:
            erro = erroDisciplinaRelacionada
        try:
            drs = ListarDisciplinaRelacionada(request, id)
            if not len(drs):
                erroLista = "Nenhum registro encontrado"
        except Exception as ex:
            erroLista = str(ex)
        return render_to_response('disciplinarelacionada.html', locals() , context_instance=RequestContext(request))
    else:
        return HttpResponseRedirect('/PlanoEnsino/')

@login_required()
@csrf_exempt
def IncluirDisciplinaRelacionada(request, id):
    global erroDisciplinaRelacionada
    erroDisciplinaRelacionada = ''
    
    if request.method=='POST':
        form = DisciplinaRelacionadaForm(request.POST)
        if form.is_valid():
            disciplinarelacionada = DisciplinaRelacionada()
            try:
                disciplinarelacionada.planoEnsino = PlanoEnsino.objects.get(id=id)
                disciplinarelacionada.disciplina = form.cleaned_data['disciplinaRelacionada']
                disciplinarelacionada.preRequisito = form.cleaned_data['prerequisito']
                if str(form.cleaned_data['disciplinaRelacionada']) != str(disciplinarelacionada.planoEnsino.curso_disciplina.disciplina):
                    disciplinarelacionada.save(force_insert=False, force_update=False, using=None)
                else:
                    erroDisciplinaRelacionada = 'Não é possivel relacionar a mesma disciplina de seu plano de ensino'
            except Exception as ex:
                if str(ex) == 'columns planoEnsino_id, disciplina_id are not unique':
                    erroDisciplinaRelacionada = 'A relação já existe'
                else:
                    erroDisciplinaRelacionada = str(ex)
    else:
        form = DisciplinaRelacionadaForm()
        erroDisciplinaRelacionada = 'Houve uma falha, tente novamente ou entre em contato com o coordenador'
    return HttpResponseRedirect('/DisciplinaRelacionada/'+id)

@login_required()
def ExcluirDisciplinaRelacionada(request, id, iditem):
    global erroDisciplinaRelacionada
    erroDisciplinaRelacionada = ''
    
    if request.method=='GET':
        try:
            dr = DisciplinaRelacionada.objects.get(id=iditem)
            dr.delete()
        except Exception as ex:
            erroDisciplinaRelacionada = str(ex)    
    return HttpResponseRedirect('/DisciplinaRelacionada/'+id)

@login_required()
def ListarDisciplinaRelacionada(request,id):
    
    try:    
        
        disciplinasRelacionadasPlanoEnsino = DisciplinaRelacionada.objects.filter(planoEnsino = PlanoEnsino.objects.get(id=id))
        disciplinaRelacionada = {}
        listaDisciplinaRelacionada = []

        for item in disciplinasRelacionadasPlanoEnsino:
            disciplinaRelacionada['dr'] = item
            disciplinaRelacionada['id'] = item.id
            disciplinaRelacionada['PlanoEnsino'] = item.planoEnsino
            disciplinaRelacionada['Disciplina'] = item.disciplina
            disciplinaRelacionada['PreRequisito'] = item.preRequisito
            listaDisciplinaRelacionada.append(disciplinaRelacionada)
            disciplinaRelacionada = {}
        return listaDisciplinaRelacionada
    except Exception as ex:
        raise ex


#### Competencia ####

@login_required()
@csrf_exempt
def CompetenciaView(request, id):
    global erroCompetencia
    erro = ''
    erroLista = ''
    if VerificarPermissao(request, id):
        form = CompetenciaForm()
        usuario = request.user
        if erroCompetencia:
            erro = erroCompetencia
        try:
            competencias = ListarCompetencia(request, id)
            if not len(competencias):
                erroLista = "Nenhum registro encontrado"
        except Exception as ex:
            erroLista = str(ex)
        return render_to_response('competencia.html', locals() , context_instance=RequestContext(request))
    else:
        return HttpResponseRedirect('/PlanoEnsino/')

@login_required()
@csrf_exempt
def IncluirCompetencia(request, id):
    global erroCompetencia
    erroCompetencia = ''
    
    if request.method=='POST':
        form = CompetenciaForm(request.POST)
        if form.is_valid():
            competenciaHabilidade = CompetenciaHabilidade()
            if form.cleaned_data['competencia'] == "":
                erroCompetencia = "Preencha as informações de competência"
            else:
                try:
                    competenciaHabilidade.bloom = form.cleaned_data['verbo']
                    competenciaHabilidade.descricao = form.cleaned_data['competencia']
                    try:
                        competenciaHabilidade.save(force_insert=False, force_update=False, using=None)   
                    except Exception as ex:
                        if str(ex) == "columns descricao, bloom are not unique":
                            competenciaHabilidade = CompetenciaHabilidade.objects.filter(descricao=competenciaHabilidade.descricao).filter(bloom=competenciaHabilidade.bloom).get()
                        else:
                            raise ex
                
                    planoEnsino = PlanoEnsino()
                    planoEnsino = PlanoEnsino.objects.get(id=id)
                    planoEnsino.competencia.add(competenciaHabilidade)
                except Exception as ex:
                    erroCompetencia = str(ex)
    return HttpResponseRedirect('/Competencia/'+id)

@login_required()
def ExcluirCompetencia(request, id, iditem):
    global erroCompetencia
    erroCompetencia = ''
    
    if request.method=='GET':
        try:
            planoEnsino = PlanoEnsino()
            planoEnsino = PlanoEnsino.objects.get(id=id)
            planoEnsino.competencia.remove(str(iditem))
        except Exception as ex:
            erroCompetencia = str(ex)    
    return HttpResponseRedirect('/Competencia/'+id)

@login_required()
def ListarCompetencia(request, id):
    
    try:    
        
        planoEnsino = PlanoEnsino.objects.get(id=id)
                                                                                                  
        competenciasPlanoEnsino = planoEnsino.competencia.all()
        competencia = {}
        listaCompetencia = []
        
        for item in competenciasPlanoEnsino:
            competencia['pe'] = item
            competencia['id'] = item.id
            competencia['bloom'] = BLOOM_CHOICES[int(item.bloom)-1][1]
            competencia['descricao'] = item.descricao
            listaCompetencia.append(competencia)
            competencia = {}
        return listaCompetencia
    except Exception as ex:
        raise ex


#### Habilidade ####

@login_required()
@csrf_exempt
def HabilidadeView(request, id):
    global erroHabilidade
    erro = ''
    erroLista = ''
    if VerificarPermissao(request, id):
        form = HabilidadeForm()
        usuario = request.user
        if erroHabilidade:
            erro = erroHabilidade
        try:
            habilidades = ListarHabilidade(request, id)
            if not len(habilidades):
                erroLista = "Nenhum registro encontrado"
        except Exception as ex:
            erroLista = str(ex)
        return render_to_response('habilidade.html', locals() , context_instance=RequestContext(request))
    else:
        return HttpResponseRedirect('/PlanoEnsino/')

@login_required()
@csrf_exempt
def IncluirHabilidade(request, id):
    global erroHabilidade
    erroHabilidade = ''
    
    if request.method=='POST':
        form = HabilidadeForm(request.POST)
        if form.is_valid():
            competenciaHabilidade = CompetenciaHabilidade()
            if form.cleaned_data['habilidade'] == "":
                erroHabilidade = "Preencha as informações de habilidade"
            else:
                try:
                    competenciaHabilidade.bloom = form.cleaned_data['verbo']
                    competenciaHabilidade.descricao = form.cleaned_data['habilidade']

                    try:
                        competenciaHabilidade.save(force_insert=False, force_update=False, using=None)
                    except Exception as ex:
                        if str(ex) == "columns descricao, bloom are not unique":
                            competenciaHabilidade = CompetenciaHabilidade.objects.filter(descricao=competenciaHabilidade.descricao).filter(bloom=competenciaHabilidade.bloom).get()
                        else:
                            raise ex
     
                    planoEnsino = PlanoEnsino()
                    planoEnsino = PlanoEnsino.objects.get(id=id)
                    planoEnsino.habilidade.add(competenciaHabilidade)
                except Exception as ex:
                    erroHabilidade = str(ex)                    
    return HttpResponseRedirect('/Habilidade/'+id)

@login_required()
def ExcluirHabilidade(request, id, iditem):
    global erroHabilidade
    erroHabilidade = ''
    
    if request.method=='GET':
        try:
            planoEnsino = PlanoEnsino()
            planoEnsino = PlanoEnsino.objects.select_related().get(id=id)
            planoEnsino.habilidade.remove(str(iditem))
        except Exception as ex:
            erroHabilidade = str(ex)    
    return HttpResponseRedirect('/Habilidade/'+id)
   
@login_required()
def ListarHabilidade(request, id):
    
    try:    
        
        planoEnsino = PlanoEnsino.objects.get(id=id)
                                                                                                  
        habilidadesPlanoEnsino = planoEnsino.habilidade.all()
        habilidade = {}
        listaHabilidade = []
        
        for item in habilidadesPlanoEnsino:
            habilidade['pe'] = item
            habilidade['id'] = item.id
            habilidade['bloom'] = BLOOM_CHOICES[int(item.bloom)-1][1]
            habilidade['descricao'] = item.descricao
            listaHabilidade.append(habilidade)
            habilidade = {}
        return listaHabilidade
    except Exception as ex:
        raise ex


#### Conteudo Programatico ####

@login_required()
@csrf_exempt
def ConteudoProgramaticoView(request, id):
    global erroConteudoProgramatico
    erro = ''
    erroLista = ''
    if VerificarPermissao(request, id):
        form = ConteudoProgramaticoForm()
        usuario = request.user
        if erroConteudoProgramatico:
            erro = erroConteudoProgramatico
             
        try:
            planoEnsino = PlanoEnsino.objects.get(id=id)
            competencias = planoEnsino.competencia.all()
            habilidades = planoEnsino.habilidade.all()
            
            for competencia in competencias:
                form.competenciaHabilidade.choices.append(competencia)
            
            conteudos = ListarConteudoProgramatico(request, id)
            if not len(conteudos):
                erroLista = "Nenhum registro encontrado"
        except Exception as ex:
            erroLista = str(ex)
        return render_to_response('conteudoprogramatico.html', locals() , context_instance=RequestContext(request))
    else:
        return HttpResponseRedirect('/PlanoEnsino/')

@login_required()
def ListarConteudoProgramatico(request, id):
    try:        
        planoEnsino = PlanoEnsino.objects.get(id=id)
                                                                                                  
        conteudosPlanoEnsino = planoEnsino.conteudoprogramatico.all()
        conteudo = {}
        listaConteudo = []
        
        for item in conteudosPlanoEnsino:
            conteudo['pe'] = item
            conteudo['id'] = item.id
            conteudo['data'] = item.dataPrevista
            conteudo['aula'] = item.aula
            listaConteudo.append(conteudo)
            conteudo= {}
        return listaConteudo
    except Exception as ex:
        raise ex

def login(request):
    if request.method=='POST':
        teste = 1